/* -*- jde -*- */
package app.mail;

import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.*;
import javax.mail.internet.*;

/**
 * Clase de envio de mails.
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Diciembre 2011
 * @version 0.1
 */
public class MailCore {

    /**
     * El correo del que se envía
     */
    private String email;
    /**
     * El password del correo que envía
     */
    private String pswd;
    /**
     * El lugar desde donde se enviaran los correos
     */
    private String host;
    /**
     * El puerto que se utilizará para dicho propósito
     */
    private String port;

    /**
     * Constructor privado para mantener un único ejemplar de la clase
     */
    public MailCore() {
        email = "bolsaciencias@gmail.com";
        pswd = "contrasenia.123";
        host = "smtp.gmail.com";
        port = "465";
    }

    /**
     * Permite mandar un correo electrónico a la dirección destinataria
     *
     * @param mail_to La dirección destinataria
     * @param subject El asunto del mensaje
     * @param body El cuerpo del mensaje1
     * @throws MailException
     */
    private void sendMail(String mail_to, String subject, String body) throws MailException {

        Properties properties = new Properties();
        properties.put("mail.smtp.host", getHost());
        properties.put("mail.smtp.user", getEmail());
        properties.put("mail.smtp.port", getPort());
        properties.put("mail.smtp.starttls.enable", "true");
        properties.put("mail.smtp.auth", "true");
        properties.put("mail.smtp.socketFactory.port", getPort());
        properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        properties.put("mail.smtp.socketFactory.fallback", "false");

        //SecurityManager security = System.getSecurityManager();

        try {

            Authenticator auth = new SMTPAuthenticator(getEmail(), getPswd());
            Session session = Session.getInstance(properties, auth);
            MimeMessage msg = new MimeMessage(session);
            msg.setText(body);
            msg.setSubject(subject);
            msg.setFrom(new InternetAddress(getEmail()));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(mail_to));
            Transport.send(msg);

        } catch (Exception ex) {

            throw new MailException("***Mail*** " + ex.getMessage());

        }
    }

    /**
     * Método público que permite enviar un correo electrónico en un hilo de
     * ejecución por separado
     *
     * @param mail_to
     * @param subject
     * @param body
     */
    public void send(final String mail_to, final String subject, final String body) {
        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        try {
                            sendMail(mail_to, subject, body);
                        } catch (MailException ex) {
                            Logger.getLogger(MailCore.class.getName()).log(Level.SEVERE, null, ex);
                            System.err.println(ex.getMessage());
                        }
                    }
                }).start();
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return the pswd
     */
    public String getPswd() {
        return pswd;
    }

    /**
     * @param pswd the pswd to set
     */
    public void setPswd(String pswd) {
        this.pswd = pswd;
    }

    /**
     * @return the host
     */
    public String getHost() {
        return host;
    }

    /**
     * @param host the host to set
     */
    public void setHost(String host) {
        this.host = host;
    }

    /**
     * @return the port
     */
    public String getPort() {
        return port;
    }

    /**
     * @param port the port to set
     */
    public void setPort(String port) {
        this.port = port;
    }

    /**
     * Metodo de prueba de funcionamiento para la clase MailCore
     *
     * @param args
     */
    public static void main(String args[]) {
        MailCore mail = new MailCore();
        mail.send("v1ctor@ciencias.unam.mx", "Asunto de la prueba de envio de correo",
                "Cuerpo del mensaje de la prueba de envio de correo");
        mail.send("claguna@ciencias.unam.mx", "Asunto de la prueba de envio de correo",
                "Cuerpo del mensaje de la prueba de envio de correo");
    }
}
